/*
用途：生成如下推文的列表的 Markdown 文本
    - 连享会主页-推文列表-按类别: https://www.lianxh.cn/news/d4d5cd7220bc7.html
    - 连享会主页-推文列表-按时间: https://www.lianxh.cn/news/451e863542710.html
    - PDF 版本：https://file.lianxh.cn/KC/lianxh_Blogs.pdf
*/


/* 更新计划：2021/9/24 19:04
1. 做成一个 ado 程序，可以自动输出最终的 md 文档
2. 头部和尾部信息可以另设一个 txt 文档，append 到上述 md 文档中
3. 程序 2 lianxh keyword --> 列出

*-options
  - Date	输出的 md 文档中是否包含日期，若加上就包含日期
  - Catlink	推文分类是否包含超链接
  - NOTime	不输出按日期分类的推文列表
  - NOTOP	不附加头尾信息
  - Saving() 存储路径，默认为 D:\vsCode\推文-lianxh.cn\OK-lianxh主页\主页推文列表" 
*/

/*
- 计划：抽取推文浏览次数 2020/12/7 23:10，尚未开始
*/


global path "D:\stata15\ado\personal\lianxh_Blogs"

global D   "$path/data"
global out "$path/out"

cd $D

*--------------------基本参数-----------------

  local YesCatLink = 1  // 分类带链接
  local YesCatLink = 0  // 分类不带链接
  *-Markdown文档输出路径
  global pp "D:\vsCode\推文-lianxh.cn\OK-lianxh主页\主页推文列表" 

*---------------------------------------------- 
  
  
  
  
*-爬取网页信息 --> text 文本
  copy "https://www.lianxh.cn/blogs.html" "lianxh.txt", replace
  copy "https://www.lianxh.cn/blogs.html" "lianxh.html", replace //便于查看代码
  
  infix strL v 1-1000 using "lianxh.txt", clear
  
  save "lxh_html_text.dta", replace  // 原始网页数据


*------------------
*- 推文标题
*------------------

  use "lxh_html_text.dta", clear

*-抽取推文链接  ok  * 以 「"><a href="」开头，「"」结尾的字符串 
  local regex = `"(?<="><a href=")(.*)(?=")"' 
  gen BlogURL = ustrregexs(0) if ustrregexm(v, `"`regex'"')
  replace BlogURL = "https://www.lianxh.cn" + BlogURL if BlogURL!=""

*-抽取推文标题 
  local regex = `"(?<=html">)(.+)(?=</a></h3>)"'
  gen BlogTitle = ustrregexs(0) if ustrregexm(v, `"`regex'"')

*-抽取分类标签
*-Note: 需要|<span>结果输出</span>|，而不需要 |<span>04/02</span>|, 所以，使用「\D」排除后者
  local regex = `"(<span>)(\D.*)(?:</span>)"'  
  gen CatName = ustrregexs(2) if ustrregexm(v, `"`regex'"')
  drop if ustrregexm(CatName, "(data\[item\])")
  keep if (BlogURL!="" | CatName!="")
  replace CatName = CatName[_n+1] if CatName==""
  keep if BlogTitle!=""
  *-剔除不需要的
  drop v
  drop if ustrregexm(BlogTitle, "(data\[item\])")
  format BlogTitle %-60s
  gen Blog_Date_id = _n         // 推文发表时间序号
  
  save "BlogTitle.dta", replace 


*-分类标签按顺序呈现 (原网页中的标签顺序较乱，但又不能修改，否则会影响网址)
  use "lxh_html_text.dta", replace
  
  local regex = `"(?<=/blogs/)\d+(?=\.html)"'
  gen catID = ustrregexs(0) if ustrregexm(v, `"`regex'"')  // 分类编号

  keep if catID != ""
  local regex = `"(?<=\s>).+(?=</a>)"'
  gen CatName = ustrregexs(0) if ustrregexm(v, `"`regex'"')  // 分类名称
  drop v 
  destring catID, replace 
  save "catID.dta", replace  // 临时保存文件，随后与主文件合并 
  
  *-呈现顺序
		clear
		#d ;
		mat CatIDnew = (44	,	1	\
						34	,	2	\
						31	,	3	\
						43	,	10	\
						16	,	8	\
						17	,	9	\
						18	,	4	\
						35	,	11	\
						25	,	12	\
						24	,	13	\
						26	,	14	\
						22	,	17	\
						32	,	21	\
						20	,	22	\
						38	,	24	\
						39	,	26	\
						40	,	28	\
						41	,	30	\
						42	,	32	\
						19	,	43	\
						21	,	45	\
						28	,	47	\
						29	,	49	\
						27	,	51	\
						36	,	61	\
						37	,	63	\
						45	,	71	\
						46	,	72	\
						47	,	73	\
						48	,	74	\
						49	,	75	\
						30	,	97	\
						23	,	98	\
						33	,	99	) ;
		#d cr 
		svmat CatIDnew, names(idv) 
		rename (idv1 idv2) (catID cat123)
		save "catSort.dta", replace  // 包含分类排序的数据
  

    
*-合并数据
  use "catID.dta", clear 
  merge 1:1 catID   using "catSort.dta", nogen 
  merge 1:m CatName using "BlogTitle.dta", nogen 
  
  gen list  =   "- [" + BlogTitle + "](" + BlogURL + ")"
 *gen list2 = "  - [" + BlogTitle + "](" + BlogURL + ")"
  
  	   tostring catID, gen(catID_str)
	   *- https://www.lianxh.cn/blogs/20.html
	   local url "https://www.lianxh.cn/blogs/"
	   gen CatURL = "`url'" + catID_str + ".html"
	   gen CatNameURL_md = "[" + CatName + "](" + CatURL + ")"
	  
  
  save "Final_data.dta", replace 
  
  
  
  
  
*---------------------
*- 输出 Markdown 文档
*---------------------

use "Final_data.dta", clear 

*-v1: 按时间顺序排序
preserve    
  local date = subinstr("`c(current_date)'"," ","",3)
  insobs 4, before(1)  //增加一行观察值，以便写大标题
  replace Blog_Date_id = -9 in 1
  replace Blog_Date_id = -8 in 2
  replace Blog_Date_id = -7 in 3
  replace Blog_Date_id = -6 in 4
  
  replace list = "## 连享会 - 推文列表" if Blog_Date_id==-9
  replace list = "> &emsp;     " if Blog_Date_id==-8
  replace list = "> &#x231A; Update: ``date'` &emsp;  &#x2B55; [**按类别查看**](https://www.lianxh.cn/news/d4d5cd7220bc7.html)  " if Blog_Date_id==-7
  replace list = "> &emsp;     " if Blog_Date_id==-6
  
    sort Blog_Date_id  // 按时间排序
	local date = subinstr("`c(current_date)'"," ","",3)
	local filename "连享会主页_推文列表-时间_`date'.md"
    export delimited list using "`filename'", ///
           novar nolabel delimiter(tab) replace	 
	*-屏幕显示打开文件的链接	   
    export delimited list using "$pp/`filename'.md", ///
           novar nolabel delimiter(tab) replace	
	  noi dis _n ///
	      _col(5)  `"{stata `" view "$pp/`filename'.md" "': View}"' ///
	  	  _col(20) `"{stata `"shellout "$pp/`filename'.md" "' : open_Win}"' ///
	      _col(38) `"{browse `"$pp"': dir}"'		   
restore 



*-v2: 分类排序

use "Final_data.dta", clear 

  keep cat123 Blog_Date_id  list  CatNameURL_md  CatName
  format list CatNameURL_md %-20s

  sort cat123 Blog_Date_id 
  gen Blog_Date_id_temp = _n
  egen tag = tag(cat123)
  expand 2 if tag==1, gen(tag_expand)  
  gsort cat123 -tag_expand
  
  
  *-分类标题
  *gen list0 = list  // 备份一下
  
  if `YesCatLink'==1{
    *local mdLab_L  `""["+"'
	*local mdLab_R  `"+"]""'
	*local mdLink   `" + "(" + CatLink + ")" "'   
	 local CatName "CatNameURL_md"
  }
  else{
     local CatName "CatName"
  }
  replace list = "## " + `CatName' if tag_expand==1   // 分类标题-文本
/*
  dis `" "## " + "`mdLab_L'"  CatName  "`mdLab_R'`mdLink'"   "'
  replace list = "## " + "`mdLab_L'" + CatName + "`mdLab_R'" + "`mdLink'" if tag_expand==1
*/

  replace list = list if tag_expand==0
  
  gsort Blog_Date_id_temp -tag -tag_exp
  *br list tag* cat* 
  
    local date = subinstr("`c(current_date)'"," ","",3)
    insobs 4, before(1)  //增加几行观察值，以便写大标题
    replace Blog_Date_id = -9 in 1
    replace Blog_Date_id = -8 in 2
    replace Blog_Date_id = -7 in 3
    replace Blog_Date_id = -6 in 4
    
    replace list = "## 连享会 - 推文列表" if Blog_Date_id==-9
    replace list = "> &emsp;     " if Blog_Date_id==-8
    replace list = "> &#x231A; Update: ``date'` &emsp;  &#x2B55; [**按时间顺序查看**](https://www.lianxh.cn/news/451e863542710.html)  " if Blog_Date_id==-7
    replace list = "> &emsp;     " if Blog_Date_id==-6
  
  *-输出 
	local date = subinstr("`c(current_date)'"," ","",3)
	
	local filename "连享会主页_推文列表-分类_`date'.md"
	
    export delimited list using "`filename'", ///
           novar nolabel delimiter(tab) replace	 
    export delimited list using "$pp/`filename'.md", ///
           novar nolabel delimiter(tab) replace	
		   
	*-屏幕链接 	   
	  noi dis _n ///
	      _col(5)  `"{stata `" view "$pp/`filename'.md" "': View}"' ///
	  	  _col(20) `"{stata `"shellout "$pp/`filename'.md" "' : open_Win}"' ///
	      _col(38) `"{browse `"$pp"': dir}"'
  
exit	
 